// 在 utils/api.ts 中做一些全局的拦截操作
import axios from "axios";
import config from "./config";

// 取消重复请求，即拦截多次频繁请求相同接口
let pendingList = [];
const cancelToken = axios.CancelToken;
const removePending = config => {
  // AxiosRequestConfig类型
  for (let p in pendingList) {
    let item = p;
    let list = pendingList[p];
    // 当前请求在数组中存在时执行函数体
    if (
      list.url ===
      config.url +
        "&request_type=" +
        config.method +
        "&params=" +
        JSON.stringify(config.data)
    ) {
      // 执行取消操作
      list.cancel();
      // 从数组中移除记录
      pendingList.splice(item, 1);
    }
  }
};

const service = axios.create(config);

// 添加请求拦截器
service.interceptors.request.use(
  config => {
    removePending(config); // 请求处理的拦截器,比如使用promise.all()多次请求getWhole接口
    config.cancelToken = new cancelToken(c => {
      pendingList.push({
        url:
          config.url +
          "&request_type=" +
          config.method +
          "&params=" +
          JSON.stringify(config.data),
        cancel: c
      });
    });
    return config;
  },
  error => {
    return Promise.reject(error);
  }
);

// 返回状态判断(添加响应拦截器)
service.interceptors.response.use(
  res => {
    removePending(res.config);
    return Promise.resolve(res); // 旧模式:return res; 直接处理返回promise对象
  },
  error => {
    return Promise.reject(error);
  }
);

export default service;
